class AccountController < ApplicationController
  
  layout 'empty'
  
  before_filter :login_required, :except=>[:login, :index, :new_admin, :create_admin]
  require_role 'admin', :only=>[:new, :signup, :list, :mails, :destroy]
  
  def index
    unless logged_in? || User.count > 0
      redirect_to :action => 'login'
    else
      redirect_to :controller=>'main'
    end
  end
  
  # FIXME encryptar el pass cuando sale de aca
  def login
    @login = params[:login]
    return unless request.post?
    self.current_user = User.authenticate(params[:login], params[:password])
    if logged_in? 
      # ingreso con exito
      K_LOGGER.info(current_user.login+" logged in.")
      flash[:success] = "Bienvenido a Ksh&ecirc;ma"
      flash[:notice] = ""
      
      # TODO pasar esto a BackgroundDRB cuidadosamente, ver el codigo interno.
      # modifica el coeficiente de personas con evasiones no analizadas aun, etc.
      # concatena en flash[:notice]
      actualizar_coeficientes
      
      # listado de todos los alumnos que cumplen en la fecha
      Persona.find_alumnos(:all, :conditions=>"MONTH(fecha_nacimiento)=#{Date.today.month} AND DAY(fecha_nacimiento)=#{Date.today.day}").collect{
        |c| flash[:notice] += "<a href='/personas/pre_show/#{c.id}'>#{ERB::Util::h(c.nombre_completo)}</a> cumple a&ntilde;os hoy!!!<br>"
      }
      
      # para que no se imprima el div vacio nulifico notice si esta vacio.
      if flash[:notice] == "" then
        flash[:notice] = nil
      end
      
      # va hacia donde estaba cuando vencio la sesion o hacia el index
      redirect_back_or_default(:controller => '/main', :action => 'index')
    else
      flash[:error] = "Error de usuario/contrase&ntilde;a"
    end
  end
  
  # FIXME mandar la pass encriptada
  def new_admin
    if User.count > 0 then
      redirect_back_or_default(:controller => '/main', :action => 'index')
    else
      @user = User.new(params[:user])
      render :action => 'new_admin', :layout=>'account'
    end
  end
  
  def create_admin
    if User.count > 0 then
      K_LOGGER.info 'Alguien intenta crear un nuevo administrador aunque este ya existe.'
      redirect_back_or_default(:controller => '/main', :action => 'index')
    else
      return unless request.post?
      @instructor = Instructor.create(params[:instructor])
      @user = User.new(params[:user])
      @user.instructor_id = @instructor.id
      unless @user.save! then
        @instructor.destroy
      end
      K_LOGGER.info "Administrador creado."
      flash[:success] = "Administrador creado"
      redirect_back_or_default(:controller => '/account', :action => 'index')
    end
  rescue ActiveRecord::RecordInvalid
    render :action => 'new_admin', :layout=>'account'
  end
  
  # FIXME enviar la pass encritada
  def new
    @user = User.new(params[:user])
    render :layout=>'application'
  end
  
  def signup
    @user = User.new(params[:user])
    return unless request.post?
    @user.save!
    flash[:success] = "Usuario creado"
    redirect_back_or_default(:controller => '/account', :action => 'index')
  rescue ActiveRecord::RecordInvalid
    render :action => 'new', :layout=>'application'
  end
  
  def logout
    self.current_user.forget_me if logged_in?
    cookies.delete :auth_token
    reset_session
    K_LOGGER.info(current_user.login+" logged out.")
    flash[:success] = "La sesi&oacute;n fue cerrada con &eacute;xito."
    redirect_back_or_default(:controller => '/account', :action => 'login')
  end
  
  def list
    store_location
    @users = User.find(:all)
    render :layout=>'application'
  end
  
  def destroy
    User.find(params[:id]).destroy
    flash[:success] = "El usuario fue eliminado"
    redirect_back_or_default(:controller => '/account', :action => 'list')
  end
  
  def edit
    @user = User.find(params[:id])
    render :layout=>'application'
  end
  
  def update
    @user = User.find(params[:id])
    @user.email = params[:user][:email]
    #solo el administrador puede cambiar los roles o el instr.
    if current_user.has_role?('admin')
      @user.role_ids = params[:user][:role_ids]
      @user.instructor_id = params[:user][:instructor_id]
    end
    if params[:user][:password]!='' then
      @user.password = params[:user][:password]
      @user.password_confirmation = params[:user][:password_confirmation]
    end
    @user.save!
    flash[:success] = "Usuario modificado"
    redirect_back_or_default(:controller => '/account', :action => 'index')
  rescue ActiveRecord::RecordInvalid
    render :action => 'edit', :layout=>'application'
  end
  
  def mails
    store_location
    @mails_de = "usuarios"
    @mails = User.find(:all, :conditions => "email <> ''").collect { |p| p.email }
    @mails = (@mails and @mails.size>0)? @mails.join('; ') : ''
    render :layout=>'application'
  end
  
  # cuanto dias atras chekear personas con coeficiente desactualizado
  DIAS_ATRAS = 15
  
  private
  def actualizar_coeficientes
    # actualizo los coeficiente aun desactualizados de los ultimos DIAS_ATRAS dias
    # Esto es para las matriculas o evasiones ingresadas "a futuro". 
    # los DIAS_ATRAS son por si nadie ingresa al sistema durante esos dias.
    
    personas_modificadas_ultimamente = Persona.find(:all, :conditions=>"(((coeficiente_id=#{Coeficiente::ALUMNO}) AND (EXISTS (SELECT * FROM evasions e WHERE personas.id=e.persona_id AND DATEDIFF(CURDATE(),fecha)<#{DIAS_ATRAS} AND DATEDIFF(CURDATE(),fecha)>0  ))) OR ((coeficiente_id<>#{Coeficiente::ALUMNO}) AND (EXISTS (SELECT * FROM matriculas m WHERE personas.id=m.persona_id AND DATEDIFF(CURDATE(),fecha)<#{DIAS_ATRAS} AND DATEDIFF(CURDATE(),fecha)>0 ))))")
    for p in personas_modificadas_ultimamente do
      aux = p
      if aux.coeficiente_id != aux.actualizar_coeficiente then
        aux.coeficiente_id = aux.actualizar_coeficiente
        aux.save
        flash[:notice] += "<br><a href='/personas/pre_show/#{aux.id}'>#{ERB::Util::h(aux.nombre_completo)}</a> pasa a ser #{ERB::Util::h(aux.coeficiente.nombre)}.</br>"
      end
    end   
  end
  
end